#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>

// 全局常量字符串（存储在.rodata段）
const char* global_const_str = "Hello, World!";

// 函数指针类型
typedef void (*func_ptr)();

void normal_function() {
    printf("This is a normal function.\n");
}

int main() 
{
    // 1. 尝试修改常量字符串（会导致段错误）
    printf("常量字符串地址: %p\n", (void*)global_const_str);
    // 下面这行如果取消注释会导致段错误：
    // ((char*)global_const_str)[0] = 'h';  // Segmentation fault!
    
    // 2. 尝试修改代码段（也会导致段错误）
    printf("函数地址: %p\n", (void*)normal_function);
    // 下面这行如果取消注释会导致段错误：
    // ((char*)normal_function)[0] = 0xC3;  // 尝试写入ret指令
    
    // 3. 查看内存区域权限
    printf("\n查看/proc/self/maps:\n");
    system("cat /proc/self/maps | head -20");
    
    return 0;
}
